package com.xiayuxuanmin.weixinpay.utils;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * xml工具类
 * 用于解析微信返回的xml数据
 * 因为微信返回的是xml格式的数据,所以需要解析xml
 * @Author xiayuxuanmin
 * @Date 2019/8/3
 * @Description
 */
public class XMLUtil {

    /**
     * 解析xml,返回第一级元素键值对。
     * 如果第一级元素有子节点，
     * 则此节点的值是子节点的xml数据
     * @param strxml
     * @return
     * @throws JDOMException
     * @throws IOException
     */
    public static Map doXMLParse(String strxml) throws JDOMException, IOException {
        strxml = strxml.replaceFirst("encoding=\".*\"","encoding=\"UTF-8\"");
        if(null == strxml || "".equals(strxml)){
            return null;
        }
        Map m = new HashMap();
        InputStream in  = new ByteArrayInputStream(strxml.getBytes("UTF-8"));
        SAXBuilder builder = new SAXBuilder();
        Document doc = builder.build(in);
        Element root = doc.getRootElement();
        List list = root.getChildren();
        Iterator it = list.iterator();
        while(it.hasNext()){
            Element e = (Element)it.next();
            String k = e.getName();
            String y = "";
            List children = e.getChildren();
            if (children.isEmpty()) {
                y = e.getTextNormalize();
            }else{
                y = XMLUtil.getChildrenText(children);
            }
            m.put(k,y);
        }
        //关闭流
        in.close();
        return m;
    }

    /**
     * 获取子结点的xml
     * @param children
     * @return
     */
    public static String getChildrenText(List children) {
        StringBuffer sb = new StringBuffer();
        if(!children.isEmpty()) {
            Iterator it = children.iterator();
            while(it.hasNext()) {
                Element e = (Element) it.next();
                String name = e.getName();
                String value = e.getTextNormalize();
                List list = e.getChildren();
                sb.append("<" + name + ">");
                if(!list.isEmpty()) {
                    sb.append(XMLUtil.getChildrenText(list));
                }
                sb.append(value);
                sb.append("</" + name + ">");
            }
        }
        return sb.toString();
    }
}
